
function foo() {
	console.log(this.a);
}

var obj = {
	a: 2,
	foo: foo
};
var a = "out of obj";

foo();
obj.foo(); // 2 使用obj作为上下文来调用foo，那么foo被看成属于obj
//通过对象调用方法，满足隐式绑定，this将指向对象


//只用引用链的最后一层会影响到调用点，也就是会影响到this的绑定
var obj2 = {
	a: 42,
	foo: foo
};
var obj1 = {
	a: 2,
	obj2: obj2
};
obj1.obj2.foo(); // 42


//在一些时候，隐式绑定会丢失
console.log("=========绑定丢失==========");
var obj3 = {
	a: 2,
	foo: foo
};
var bar = obj3.foo; // 虽然这里bar和obj3.foo指向的是同一个函数，但是他们调用点所使用的上下文不同
var a = "oops, global"; // `a` also property on global object
obj3.foo();
bar(); // "oops, global"


// 使用回调函数造成的绑定丢失
function doFoo(fn) {
	// `fn` is just another reference to `foo`，这是一个隐式的赋值操作
	fn(); // <-- call-site!
}
var obj4 = {
	a: 2,
	foo: foo
};
var a = "oops, global"; // `a` also property on global object
doFoo( obj4.foo ); // "oops, global"
// 所以也可以理解内置函数的回调，其实效果是一样的。所以可以理解其实事件的回调函数，效果也是这样的
setTimeout( obj4.foo, 100 ); // "oops, global”